package com.DesignPattern.proxy;

import com.DesignPattern.IOC;
import com.DesignPattern.handler.MyInvocationHandler;

import java.lang.reflect.Proxy;

/**
 * @Author you-name
 * @Date 2022/4/11
 */
public class MyProxy {
    /**
     * 动态的创建一个代理类对象
     * <p>
     * MyProxy动态创建的“代理类的对象”：
     * class A implements Subject{
     *  private    Handler handler;
     *  public void test() {
     *      //获得到当前方法名:
     *      handler.invoke();
     *  }
     * }
     *
     * @param obj
     * @return
     */
    public static Object getProxyInstance(Object obj) {
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.setObject(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
    }

    /**
     * 对于有 @InOutLog 注解的，用代理类的 bean 来代替 BeanFactory 中的被代理类的 bean
     * 这一步很重要，因为当执行的到 bean.method()，执行的就一定是 bean 对应的 method() 方法
     * 如果此时没有用代理类对象去代替，那么执行的就是没有 @InOutLog 的原来的那个方法
     * @param completeClassName
     * @param object
     */
    public static void updateBean(String completeClassName, Object object) {
        IOC.updateBeanFromBeanFactory(completeClassName, getProxyInstance(object));
    }
}
